package cms.utils;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.StringTokenizer;
/**
 * 字符串工具类
 *
 */
public class StringUtil {
	/**
	 * 解析一个带 token 分隔符的字符串，这个方法的效率比直接调用String的split()方法快大约1倍
	 * @param tokenedStr
	 * @param token
	 * @return String[]
	 */
	public static String[] splitString(String tokenedStr, String token) {
		String[] ids = null;
		if (tokenedStr != null) {
			StringTokenizer st = new StringTokenizer(tokenedStr, token);
			final int arraySize = st.countTokens();
			if (arraySize > 0) {
				ids = new String[arraySize];
				int counter = 0;
				while (st.hasMoreTokens()) {
					ids[counter++] = st.nextToken();
					}
				}
			}
		return ids;
		}
	/**
	 * 把字符串数组组合成一个以指定分隔符分隔的字符串。
	 * @param strs 字符串数组
	 * @param seperator 分隔符
	 * @return
	 */
	public static String mergeString(String[] strs, String seperator) {
		StringBuilder sb = new StringBuilder();
		mergeString(strs, seperator, sb);
		return sb.toString();
	}
	/**
	 * 把List数组组合成一个以指定分隔符分隔的字符串。
	 * @param list List数组
	 * @param seperator 分隔符
	 * @return
	 */
	public static String mergeString(List list, String seperator) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < list.size(); i++) {
			if (i != 0 && list.get(i).toString()!= null && !"".equals(list.get(i).toString().trim())) {
				sb.append(seperator);
			}
			if(list.get(i).toString()!= null && !"".equals(list.get(i).toString().trim())){
				sb.append(list.get(i));
			}

		}
		return sb.toString();
	}
	/**
	 *  把字符串数组组合成一个以指定分隔符分隔的字符串，并追加到给定的<code>StringBuilder</code>
	 * @param strs 字符串数组
	 * @param seperator 分隔符
	 * @return
	 **/
	public static void mergeString(String[] strs, String seperator, StringBuilder sb) {
		for (int i = 0; i < strs.length; i++) {
			if (i != 0) {
				sb.append(seperator);
				}
			sb.append(strs[i]);
			}
		}

    /**
     * 按字节长度截取字符串
     * @param str 要截取的字符串
     * @param length 截取长度
     * @return
     * @throws Exception
     */
    public static String bSubstring(String str, int length) throws Exception{
        byte[] bytes = str.getBytes("Unicode");
        int n = 0; // 表示当前的字节数
        int i = 2; // 要截取的字节数，从第3个字节开始
        for (; i < bytes.length && n < length; i++){
            // 奇数位置，如3、5、7等，为UCS2编码中两个字节的第二个字节
            if (i % 2 == 1){
                n++; // 在UCS2第二个字节时n加1
            }else{
                // 当UCS2编码的第一个字节不等于0时，该UCS2字符为汉字，一个汉字算两个字节
                if (bytes[i] != 0){
                    n++;
                }
            }
        }
        // 如果i为奇数时，处理成偶数
        if (i % 2 == 1){
            // 该UCS2字符是汉字时，去掉这个截一半的汉字
            if (bytes[i - 1] != 0)
                i = i - 1;
            // 该UCS2字符是字母或数字，则保留该字符
            else
                i = i + 1;
        }
        return new String(bytes, 0, i, "Unicode");
    }

    /**
     * 清除前后空格&nbsp;
     * @param html
     * @return

    public static String clearSpace(String html){
    	return html.replaceAll("^&nbsp;|&nbsp;$","");
    } */
    /**
     * 替换空格&nbsp;
     * @param html
     * @return
     */
    public static String replaceSpace(String html){
    	return html.toLowerCase().replaceAll("(?i)&nbsp;","");

    }

    /**
     * 转义like语句中的
     * <code>'_'</code><code>'%'</code>
     * 将<code>'?'</code>转成sql的<code>'/_'</code>
     * 将<code>'%'</code>转成sql的<code>'/%'</code>
     * <p>
     *   例如搜索<code>?aa*bb?c_d%f</code>将转化成<br/>
     *   <code>_aa%bb_c/_d/%f</code>
     * </p>
     * @param likeStr
     * @return
     * @author <a href="http://jdkcn.com" mce_href="http://jdkcn.com">somebody</a>
     */
    public static String escapeSQLLike(String likeStr) {
        String str = StringUtils.replace(likeStr, "_", "/_");
        str = StringUtils.replace(str, "%",    "/%");
        str = StringUtils.replace(str, "?", "_");
        str = StringUtils.replace(str, "*", "%");
        return str;
    }



}
